home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / var / lib / python-support / python2.6 / gnome_sudoku / saver.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  8.9 KB  |  255 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import pickle
  5. import types
  6. import os
  7. import os.path as os
  8. import sudoku
  9. import errno
  10. from defaults import *
  11. from gtk_goodies.dialog_extras import show_message
  12. from gettext import gettext as _
  13. SAVE_ATTRIBUTES = [
  14.     'gsd.hints',
  15.     'gsd.impossible_hints',
  16.     'gsd.auto_fills',
  17.     'timer.__absolute_start_time__',
  18.     'timer.tot_time',
  19.     'timer.tot_time_complete']
  20.  
  21. def super_getattr(obj, attr):
  22.     '''getattr, following the dots.'''
  23.     attrs = attr.split('.')
  24.     for a in attrs:
  25.         obj = getattr(obj, a)
  26.     
  27.     return obj
  28.  
  29.  
  30. def super_setattr(obj, attr, val):
  31.     '''setattr, following the dots.'''
  32.     attrs = attr.split('.')
  33.     if len(attrs) > 1:
  34.         sub_attrs = attrs[0:-1]
  35.         attr = attrs[-1]
  36.         for a in sub_attrs:
  37.             obj = getattr(obj, a)
  38.         
  39.     
  40.     setattr(obj, attr, val)
  41.  
  42.  
  43. def jar_game(ui):
  44.     jar = { }
  45.     ui.timer.finish_timing()
  46.     jar['game'] = ui.gsd.grid.to_string()
  47.     jar['trackers'] = ui.gsd.trackers
  48.     jar['tracking'] = ui.gsd.__trackers_tracking__
  49.     jar['notes'] = []
  50.     for e in ui.gsd.__entries__.values():
  51.         (top, bot) = e.get_note_text()
  52.         if top or bot:
  53.             jar['notes'].append((e.x, e.y, top, bot))
  54.             continue
  55.     
  56.     for attr in SAVE_ATTRIBUTES:
  57.         jar[attr] = super_getattr(ui, attr)
  58.     
  59.     return jar
  60.  
  61.  
  62. def open_game(ui, jar):
  63.     ui.gsd.load_game(jar['game'])
  64.     for tracker, tracked in jar.get('trackers', { }).items():
  65.         ui.tracker_ui.add_tracker()
  66.         for x, y, val in tracked:
  67.             ui.gsd.add_tracker(x, y, tracker, val = val)
  68.         
  69.     
  70.     for tracker, tracking in jar.get('tracking', { }).items():
  71.         if tracking:
  72.             ui.tracker_ui.select_tracker(tracker)
  73.             continue
  74.     
  75.     for attr in SAVE_ATTRIBUTES:
  76.         super_setattr(ui, attr, jar.get(attr, None))
  77.     
  78.     for attr in SAVE_ATTRIBUTES:
  79.         if jar.get(attr, None) == None:
  80.             super_setattr(ui, attr, 0)
  81.             continue
  82.     
  83.     if jar.has_key('notes') and jar['notes']:
  84.         for x, y, top, bot in jar['notes']:
  85.             ui.gsd.__entries__[(x, y)].set_note_text(top, bot)
  86.         
  87.     
  88.  
  89.  
  90. def pickle_game(ui, target):
  91.     close_me = False
  92.     if type(target) in types.StringTypes:
  93.         target = file(target, 'w')
  94.         close_me = True
  95.     
  96.     to_dump = jar_game(ui)
  97.     pickle.dump(to_dump, target)
  98.     if close_me:
  99.         target.close()
  100.     
  101.  
  102.  
  103. def unpickle_game(ui, target):
  104.     close_me = False
  105.     if type(target) == str:
  106.         target = file(target, 'r')
  107.         close_me = True
  108.     
  109.     open_game(ui, pickle.load(target))
  110.     if close_me:
  111.         target.close()
  112.     
  113.  
  114.  
  115. class SudokuTracker:
  116.     '''A class to track games in progress and games completed.
  117.     '''
  118.     
  119.     def __init__(self):
  120.         self.save_path = os.path.expanduser('~/.sudoku/saved')
  121.         self.finished_path = os.path.expanduser('~/.sudoku/finished')
  122.         self.create_dir_safely(self.save_path)
  123.         self.create_dir_safely(self.finished_path)
  124.  
  125.     
  126.     def create_dir_safely(self, path):
  127.         if not os.path.exists(path):
  128.             
  129.             try:
  130.                 os.makedirs(path)
  131.             except OSError:
  132.                 e = None
  133.                 if e.errno == errno.ENOSPC:
  134.                     show_message(title = _('No Space'), label = _('No space left on disk'), message_type = gtk.MESSAGE_ERROR, sublabel = _('Sudoku is unable to created data folder %(path)s.') % locals() + _('There is no disk space left!'))
  135.                 else:
  136.                     show_message(title = 'Error creating directory', label = 'Error creating directory', sublabel = _('Sudoku was unable to create data folder %(path)s.') % locals() + _('Error %(errno)s: %(error)s') % {
  137.                         'errno': e.errno,
  138.                         'error': e.strerror })
  139.             except:
  140.                 e.errno == errno.ENOSPC
  141.             
  142.  
  143.         None<EXCEPTION MATCH>OSError
  144.  
  145.     
  146.     def game_from_ui(self, ui):
  147.         return ui.gsd.grid.virgin.to_string()
  148.  
  149.     
  150.     def get_filename(self, gamestring):
  151.         return gamestring.split('\n')[0].replace(' ', '')
  152.  
  153.     
  154.     def save_game(self, ui):
  155.         game = self.game_from_ui(ui)
  156.         jar = jar_game(ui)
  157.         filename = os.path.join(self.save_path, self.get_filename(jar['game']))
  158.         
  159.         try:
  160.             outfi = file(filename, 'w')
  161.             pickle.dump(jar, outfi)
  162.             outfi.close()
  163.         except (OSError, IOError):
  164.             e = None
  165.             show_message(title = _('Sudoku unable to save game.'), label = _('Sudoku unable to save game.'), message_type = gtk.MESSAGE_ERROR, sublabel = _('Unable to save file %(filename)s.') % locals() + '\n' + _('Error %(errno)s: %(error)s') % {
  166.                 'errno': e.errno,
  167.                 'error': e.strerror })
  168.  
  169.  
  170.     
  171.     def finish_game(self, ui):
  172.         game = self.game_from_ui(ui)
  173.         jar = jar_game(ui)
  174.         self.finish_jar(jar)
  175.  
  176.     
  177.     def finish_jar(self, jar):
  178.         self.remove_from_saved_games(jar)
  179.         
  180.         try:
  181.             filename = os.path.join(self.finished_path, self.get_filename(jar['game']))
  182.             outfi = file(filename, 'w')
  183.             pickle.dump(jar, outfi)
  184.             outfi.close()
  185.         except (OSError, IOError):
  186.             e = None
  187.             show_message(title = _('Sudoku unable to mark game as finished.'), label = _('Sudoku unable to mark game as finished.'), message_type = gtk.MESSAGE_ERROR, sublabel = _('Unable to save file %(filename)s.') % locals() + '\n' + _('Error %(errno)s: %(error)s') % {
  188.                 'errno': e.errno,
  189.                 'error': e.strerror })
  190.  
  191.         
  192.         try:
  193.             filename = list_of_finished_games = os.path.join(os.path.join(DATA_DIR, 'puzzles'), 'finished')
  194.             ofi = open(list_of_finished_games, 'a')
  195.             ofi.write(jar['game'].split('\n')[0] + '\n')
  196.             ofi.close()
  197.         except (OSError, IOError):
  198.             e = None
  199.             show_message(title = _('Sudoku unable to mark game as finished.'), label = _('Sudoku unable to mark game as finished.'), message_type = gtk.MESSAGE_ERROR, sublabel = _('Unable to save file %(filename)s.') % locals() + '\n' + _('Error %(errno)s: %(error)s') % {
  200.                 'errno': e.errno,
  201.                 'error': e.strerror })
  202.  
  203.  
  204.     
  205.     def remove_from_saved_games(self, jar):
  206.         previously_saved_game = os.path.join(self.save_path, self.get_filename(jar['game']))
  207.         if os.path.exists(previously_saved_game):
  208.             os.remove(os.path.join(previously_saved_game))
  209.         
  210.  
  211.     
  212.     def abandon_game(self, ui):
  213.         game = self.game_from_ui(ui)
  214.         jar = jar_game(ui)
  215.         self.remove_from_saved_games(jar)
  216.  
  217.     
  218.     def list_saved_games(self):
  219.         
  220.         try:
  221.             files = os.listdir(self.save_path)
  222.         except OSError:
  223.             e = None
  224.             files = []
  225.  
  226.         games = []
  227.         for f in files:
  228.             f = os.path.join(self.save_path, f)
  229.             
  230.             try:
  231.                 jar = pickle.load(file(f, 'r'))
  232.             except:
  233.                 print 'Warning: could not read file', f
  234.                 continue
  235.  
  236.             if self.is_valid(jar):
  237.                 jar['saved_at'] = os.stat(f)[8]
  238.                 games.append(jar)
  239.                 continue
  240.             print 'Warning: malformed save game', f
  241.         
  242.         return games
  243.  
  244.     
  245.     def is_valid(self, jar):
  246.         virgin = jar['game'].split('\n')[0].replace(' ', '')
  247.         played = jar['game'].split('\n')[1].replace(' ', '')
  248.         if len(virgin) != 81 or len(played) != 81:
  249.             return False
  250.         if not virgin.isdigit() or not played.isdigit():
  251.             return False
  252.         return True
  253.  
  254.  
  255.